<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 1- 基本数据类型 赋值是深复制还是浅复制
    //    = 赋值   ，不能称为复制，也不能够称为拷贝。如果非要说是深复制还是浅复制，那么深复制。
    // var a = 1;
    // var b = a;
    // console.log(a,b,a===b);// 1 1

    // 2- 引用类型--->浅复制
    // var a = [1,2,3,4];
    // var b = a;
    // b.push(5);
    // console.log(a===b);// true
    // console.log(a);

    // 3- 引用类型---》深复制
    // var a = [1,2,3,4];
    // var b = Array.from(a);
    // var c = [...a];
    // var d = a.map(v=>v);
    // var e = [].concat(a);
    // console.log(b===a,c===a,d===a,e===a);

    // 4- 引用类型--->  数组中的元素如果是引用类型不能够称为深复制，对象中的属性如果是引用类型不能够称为深复制
    // var obj = {
    //     a:1,
    //     b:2
    // }
    // const obj2 = {...obj};// 深复制

    // var obj = {
    //     info:{
    //         userName:"zhangsan"
    //     }
    // }
    // const obj2 = {...obj};// 浅复制
    // console.log(obj === obj2);// false
    // console.log(obj.info === obj2.info);// true
    // obj2.info.userName = "lisi";
    // console.log(obj.info.userName);// lisi

    // var arr = [{a:1}];
    // var arr2 = [...arr];// 浅复制
    // console.log(arr === arr2);// false
    // console.log(arr[0] === arr2[0]);// true
    // arr2[0].a = 100;
    // console.log(arr[0].a);// 100

    // 解构赋值是深复制吗？
    // var [a,b,c,d] = [1,2,3,4];// 深复制
    // var [info] = [{a:1}];// 浅复制


    // 对多层数据进行深复制？
    // JSON
    // var info = {
    //     a:1,
    //     arr:[1,2,3,4],
    //     b:{
    //         c:3
    //     },
    //     lala:undefined,
    //     f:function(){
    //
    //     }
    // }
    // // var info2 = Object.assign({},info);
    // const info2 = JSON.parse(JSON.stringify(info));
    // console.log(info2 === info);// false
    // console.log(info2.arr === info.arr);// false
    // console.log(info2.b === info.b);// false
    // console.log(info2);

    // 可以封装深复制的方法
    function deepClone(source){
        // 判断source是不是数组，如果是数据result的值是数组，否则对象
        var result = Array.isArray(source)?[]:{};
        for(let key in source){
            if(source[key] && typeof source[key] === "object"){
                result[key] = deepClone(source[key]);
            }else{
                result[key] = source[key];
            }

        }
        return result;
    }
    var arr = [1,{a:1},[3]];
    var arr2 = deepClone(arr);
    console.log(arr2 === arr);
    arr2[2][0] = 100;
    console.log(arr2);

    console.log(arr);
    // var obj = {
    //     a:1,
    //     b:2,
    //     c:{
    //         d:1
    //     },
    //     fn:function(){
    //
    //     }
    // }
    // var obj2 = deepClone(obj);
    // console.log(obj2 === obj);
    // obj2.c.d = 100;
    // console.log(obj.c.d);// 1


</script>
</html>